
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;
#pragma once
#include <string>
#include <list>

#include "SQLObjectImpl.h"
#include "SQLHint.h"
class SQLASTVisitor;

// http://stackoverflow.com/questions/137282/how-can-you-avoid-the-diamond-of-death-in-c-when-using-multiple-inheritance

class SQLCommentHint : virtual public SQLObjectImpl, virtual public SQLHint
{

private:
  string_ptr text;

public:
  SQLCommentHint();
  virtual ~SQLCommentHint();

  SQLCommentHint(string_ptr text);

  SHAREDOBJECT(SQLCommentHint)   ;
  string_ptr getText();

  void setText(string_ptr text);

  virtual string_ptr getClass()
  {
    return make_string_ptr("SQLCommentHint");
  }

  // SQLCommentHint* clone() ;
  virtual SQLObject_ptr clone();

  virtual SQLObject_ptr getParent() override{};
  virtual bool containsAttribute(string_ptr name){};
  virtual void output(string_ptr buf){};
  virtual void addBeforeComment(string_list_ptr comments){};
  virtual void addBeforeComment(wstring_list_ptr comments){};
  virtual string_list_ptr getBeforeCommentsDirect(){};
  virtual void addAfterComment(string_ptr comment){};
  virtual void addAfterComment(string_list_ptr comments){};
  virtual string_list_ptr getAfterCommentsDirect(){};
  virtual bool hasBeforeComment(){};
  virtual bool hasAfterComment(){};
  virtual string_ptr toString(){};
  virtual std::shared_ptr<std::map<std::string, Object_ptr>> getAttributes(){};
  virtual std::shared_ptr<std::map<std::string, Object_ptr>> getAttributesDirect(){};
  // virtual Object_ptr getAttribute(string_ptr name){};
  // virtual void putAttribute(string_ptr name, Object_ptr value){};

protected:
  virtual void accept0(SQLASTVisitor_ptr visitor);
};

